home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / gui / precog2_1.lha / Precognition2_1 / src / src.lha / Precognition / array.c next >
Encoding:
C/C++ Source or Header  |  1994-12-08  |  5.3 KB  |  305 lines

  1. #include "array.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <stdarg.h>
  5. #include <string.h>
  6. #include <assert.h>
  7.  
  8. #ifndef NULL
  9. #define NULL (void*)0
  10. #endif
  11.  
  12. #define ALLOCSTRUCT(name) (struct name*) malloc(sizeof(struct name))
  13.  
  14. void
  15. initArray( Array *array, int length )
  16. {
  17.    array->vec       = NULL;
  18.    array->length    = 0;
  19.    array->allocsize = 0;
  20.    setLengthOfArray( array, length );
  21. }
  22.  
  23.  
  24. Array *
  25. newArray( int length )
  26. {
  27.    struct Array *array;
  28.  
  29.    if( array = ALLOCSTRUCT( Array ) )
  30.    {
  31.       initArray( array, length );
  32.    }
  33.    return array;
  34. }
  35.  
  36. void
  37. freeArray( Array *array )
  38. {
  39.    if( array )
  40.    {
  41.       if( array->vec )
  42.       {
  43.          if( array->dtor )
  44.          {
  45.             doToAllInArray( array, array->dtor );
  46.          }
  47.          free( array->vec );
  48.       }
  49.       free( array );
  50.    }
  51. }
  52.  
  53. void
  54. setArrayDestructor( Array *array, ArrayDtor dtor )
  55. {
  56.    assert( (int)array );
  57.  
  58.    array->dtor = dtor;
  59. }
  60.  
  61.  
  62. int
  63. setLengthOfArray( Array *array, int newlength ) /* returns length */
  64. {
  65.    int newsize;
  66.  
  67.    assert( (int)array );
  68.  
  69.    newsize = newlength * sizeof( VOIDPTR );
  70.  
  71.    array->length = newlength;
  72.  
  73.    if( newsize <= array->allocsize )
  74.       return array->length;
  75.  
  76.    if( array->allocsize == 0 ) array->allocsize = 1;
  77.    while( array->allocsize < newsize )
  78.       array->allocsize *= 2;
  79.  
  80.    if( array->vec == NULL )
  81.    {
  82.       array->vec = (VOIDPTR *)calloc( array->allocsize, 1 );
  83.    }
  84.    else
  85.    {
  86.       array->vec = (VOIDPTR *)realloc( array->vec, array->allocsize );
  87.    }
  88.    return array->length;
  89. }
  90.  
  91. int
  92. appendToArray( Array *array, const VOIDPTR elt )     /* returns length */
  93. {
  94.    assert( (int)array );
  95. /*printf( "appendToArray: setting length...\n" );*/
  96.    setLengthOfArray( array, array->length+1 );
  97. /*printf( "appendToArray: setting elt\n" );*/
  98.    array->vec[array->length-1] = elt;
  99. /*printf("appendToArray: done\n");*/
  100.    return array->length;
  101. }
  102.  
  103. int
  104. deleteFromArray( Array *array, int i )          /* returns length */
  105. {
  106.    assert( (int)array );
  107.  
  108.    if( i < array->length )
  109.    {
  110.       if( ( array->dtor ) && ( array->vec[i] ) )
  111.       {
  112.          (*array->dtor)( array->vec[i] );
  113.       }
  114.       array->vec[i] = NULL;
  115.  
  116.       array->length--;
  117.  
  118.       for( ; i < array->length; i++ )
  119.          array->vec[i] = array->vec[ i + 1 ];
  120.    }
  121.    return array->length;
  122. }
  123.  
  124. int
  125. deleteItemFromArray( Array *array, const VOIDPTR item )
  126. {
  127.    int i;
  128.  
  129.    i = arrayIndexOfItem( array, item );
  130.    if( i >= 0 )
  131.    {
  132.       deleteFromArray( array, i );
  133.    }
  134.    return array->length;
  135. }
  136.  
  137. void
  138. doToAllInArray( const Array *array, void (*func)(VOIDPTR) )
  139. {
  140.    int i;
  141.  
  142.    assert( (int)array );
  143.    assert( (int)func );
  144.  
  145.    for( i = 0; i < array->length; i++ )
  146.    {
  147.       if( array->vec[i] )
  148.          (*func)( array->vec[i] );
  149.    }
  150. }
  151.  
  152. int
  153. arrayIndexOfItem( const Array *array, const VOIDPTR *item )
  154. {
  155.    int i;
  156.  
  157.    assert( (int)array );
  158.  
  159.    for( i = 0; i < array->length; i++ )
  160.    {
  161.       if( item == array->vec[i] ) return i;
  162.    }
  163.    return -1;
  164. }
  165.  
  166. int
  167. arrayIndexOfItem2( const Array *array, const VOIDPTR *item, comparer func )
  168. {
  169.    int i;
  170.  
  171.    assert( (int)array );
  172.  
  173.    for( i = 0; i < array->length; i++ )
  174.    {
  175.       if( (*func)( item, array->vec[i] ) == 0 ) return i;
  176.    }
  177.    return -1;
  178. }
  179.  
  180. int
  181. arrayIndexOfString( const Array *array, const char *string )
  182. {
  183.    return arrayIndexOfItem2( array, (const VOIDPTR)string, (comparer)strcmp );
  184. }
  185.  
  186.  
  187. int
  188. appendToArrayIfAbsent( Array *array, const VOIDPTR item )
  189. {
  190.    int i;
  191.  
  192.    i = arrayIndexOfItem( array, item );
  193.  
  194.    if( i < 0 )
  195.       return appendToArray( array, item );
  196.    else
  197.       return 0;
  198. }
  199.  
  200. int
  201. appendToArrayIfAbsent2( Array *array, const VOIDPTR item, comparer func )
  202. {
  203.    int i;
  204.  
  205.    i = arrayIndexOfItem2( array,item, func );
  206.  
  207.    if( i < 0 )
  208.       return appendToArray( array, item );
  209.    else
  210.       return 0;
  211. }
  212.  
  213. int
  214. appendStringToArrayIfAbsent( Array *array, const char *string )
  215. {
  216.    int i;
  217.  
  218.    i = arrayIndexOfString( array, (const VOIDPTR)string );
  219.  
  220.    if( i < 0 )
  221.       return appendToArray( array, (const VOIDPTR)string );
  222.    else
  223.       return 0;
  224. }
  225.  
  226. int
  227. appendArrayToArray( Array *target, const Array *source )
  228. {
  229.    int i;
  230.  
  231.    assert( (int)target );
  232.    assert( (int)source );
  233.  
  234.    for( i = 0; i < source->length; i++ )
  235.       appendToArray( target, source->vec[i] );
  236.  
  237.    return target->length;
  238. }
  239.  
  240. int
  241. appendArrayToArrayIfAbsent( Array *target, const Array *source )
  242. {
  243.    int i;
  244.  
  245.    assert( (int)target );
  246.    assert( (int)source );
  247.  
  248.    for( i = 0; i < source->length; i++ )
  249.       appendToArrayIfAbsent( target, source->vec[i] );
  250.  
  251.    return target->length;
  252. }
  253.  
  254. int
  255. appendArrayToArrayIfAbsent2( Array *target, const Array *source, comparer func )
  256. {
  257.    int i;
  258.  
  259.    assert( (int)target );
  260.    assert( (int)source );
  261.  
  262.    for( i = 0; i < source->length; i++ )
  263.       appendToArrayIfAbsent2( target, source->vec[i], func );
  264.  
  265.    return target->length;
  266. }
  267.  
  268. int
  269. appendStringArrayToArrayIfAbsent( Array *target, const Array *source )
  270. {
  271.    assert( (int)target );
  272.    assert( (int)source );
  273.  
  274.    return appendArrayToArrayIfAbsent2( target, source, (comparer)strcmp );
  275. }
  276.  
  277.  
  278. Array*
  279. newStringArrayA( char **svec )
  280. {
  281.    Array *array;
  282.    int i;
  283.  
  284.    array = newArray( 0 );
  285.    setArrayDestructor( array, (ArrayDtor)free );
  286.  
  287.    for( i = 0; svec[i] != NULL; i++ )
  288.    {
  289.       appendToArray( array, svec[i] );
  290.    }
  291.    return array;
  292. }
  293.  
  294. Array*
  295. newStringArray( char *s1, ... )
  296. {
  297.    va_list ap;
  298.  
  299.    va_start( ap, s1 );
  300.    va_end( ap );
  301.  
  302.    return newStringArrayA( &s1 );
  303. }
  304.  
  305.